var age = 18
var title = 'aaa'
function foo(num) {
  console.log('num', num)
  console.log('age', age) 
  var age = 19
  console.log('title', title)
  console.log('foo')
}
foo(2)
// 函数在编译阶段，其父级作用域就被确定了，运行时沿着作用域链进行查找，查找到全局的变量没有，就会报错
// 1.代码编译阶段创建全局的GlobalObject对象 go,
var gloableObject = {
  String: '类',
  setTimeout: '定时器',
  window: gloableObject,
  //   var关键字定义的变量作用域提升
  age: undefined,
  title: undefined,
}
// 2.代码编译阶段foo是一个函数,会创建一个对象用于存放函数
var fooObj = {
  // 1.保存父级作用域链,指向父级作用域
  scope: 'gloableObject',
  //   2.创建函数作用域，且对变量进行定义
  num: undefined,
  age: undefined,
  //   3.保存其他执行体
}
console.log(window)
// 3.编译完成
gloableObject = {
  String: '类',
  setTimeout: '定时器',
  window: gloableObject,
  //   var关键字定义的变量作用域提升
  age: undefined,
  title: undefined,
  //   函数会保存创建函数obj对应的地址
  foo: fooObj,
}
// 4.运行阶段
gloableObject = {
  String: '类',
  setTimeout: '定时器',
  window: gloableObject,
  //   var关键字定义的变量作用域提升
  age: 18,
  title: 'aaa',
  //   函数会保存创建函数obj对应的地址
  foo: fooObj,
}
// 执行函数foo(2)
fooObj = {
  scope: 'gloableObject',
  num: 2,
  age: 19,
}
// 函数的执行
function foo1(num) {
  // 此时先在foo函数的作用域上查找变量执行
  console.log('num此时在foo作用域内已经被赋值：2', num)
  console.log('age在此时由于作用域提升值为undefined，没有被赋值', age)
  var age = 19
  //   此时在foo的作用域被查不到title，会沿着父级作用域scope查找到gloableObject的title
  console.log('title，全局的', title)
  console.log('foo')
}
